#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <poll.h>
#include "common_impl.h"


#define MAXBUF 1024
int sendline(int fd, char *str, int maxlen){

	int nleft, nwritten;
	const char* buffer;
	buffer = str;
	nleft=maxlen;

	while ( nleft > 0 ){
		if ( (nwritten = write (fd,buffer,nleft)) <= 0 ){
			if (errno == EINTR)
				nwritten = 0;
			else return 1;
		}
		nleft -= nwritten;
		buffer += nwritten;
	}
	return maxlen;
}


int main(int argc, char **argv)
{   

	int num_proc;
	int i;

	/* processus intermediaire pour "nettoyer" */
	/* la liste des arguments qu'on va passer */
	/* a la commande a executer vraiment */
	/* creation d'une socket pour se connecter au */
	/* au lanceur et envoyer/recevoir les infos */
	/* necessaires pour la phase dsm_init */

	int sockfd; // socket communication
	int port; // numéro du port
	struct sockaddr_in dest; // socket addresse structure
	char buffer[1024];
	int num_procs;

	char *port_received;
	port_received=argv[1];

	//	fprintf(stdout,"port recu %s\n",port_received);

	port=atoi(port_received);

	if ( (sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 ){
		fprintf(stderr, "ECHOSERV :Error creating dsm socket.\n");
		exit( EXIT_FAILURE );
	}

	/* Set all bytes in socket address structure to zero, and fill in the relevant data members */
	memset(&dest, 0, sizeof (dest));
	dest.sin_family = AF_INET;
	dest.sin_port = htons(port); // port a recuperer
	inet_aton("127.0.0.1", & dest.sin_addr); //

	/* Connection */
	if(connect(sockfd, (struct dest *) & dest, sizeof(dest)) == -1){
		perror("connect");
		exit(EXIT_FAILURE);
	}



	/*Envoi nombre de caracteres dans le nom de la machine*/

	char taille[1024];
	sprintf(taille,"%d",strlen(argv[3]));

	sendline(sockfd,taille,strlen(taille));
	/* Envoi du nom de machine au lanceur */
	sendline(sockfd,argv[3],strlen(argv[3]));
	/* Envoi du pid au lanceur */
	sendline(sockfd, argv[2],strlen(argv[2]));
	/* Envoi du numero de port au lanceur */
	sendline(sockfd, argv[1],strlen(argv[1]));

	fprintf (stdout,"Hello stdout !\n");
	fprintf (stderr,"Hello stderr !\n");




	// on lance le programme truc

	execlp("./truc","bonjour","au revoir",NULL);
	perror("exclp");
	//fprintf (stdout,"Après truc !\n");



	//	/* Recuperation du nombre de machines */
	//	readline(sockfd, buffer, MAXBUF-1);
	//	num_proc=atoi(buffer);
	//
	//	/* Recevoir autant de messages que de machines */
	//	for (i = 0; i< num_proc; i++){
	//		readline(sockfd, buffer, MAXBUF-1);
	//	}


	//		/* Recuperation du nombre de machines */
	//
	//		read(sockfd, buffer, MAXBUF-1);
	//		num_proc=atoi(buffer);
	//
	//		/* Recevoir autant de messages que de machines */
	//		for (i = 0; i< num_proc; i++){
	//			read(sockfd, buffer, MAXBUF-1);
	//		}
	//
	//
	//   /* Envoi du nom de machine au lanceur */
	//
	//   /* Envoi du pid au lanceur */
	//
	//   /* Creation de la socket d'ecoute pour les */
	//   /* connexions avec les autres processus dsm */
	//
	//   /* Envoi du numero de port au lanceur */
	//   /* pour qu'il le propage à tous les autres */
	//   /* processus dsm */
	//
	//   /* on execute la bonne commande */
	return 0;
}
